﻿using System;
using System.Collections.Generic;
using System.Text;

namespace daSyntaxAnalyser.SyntaxTree
{
    using daBase.Objects;

    /// <summary>
    /// Оператор on в блоке try...except
    /// </summary>
    public class ExceptOnStatementElement : StatementElement
    {
        private IdElement id;
        private IdElement type;
        private StatementElement statement;
        private StatementElement _else;

        /// <summary>
        /// Идентификатор ошибки
        /// </summary>
        public IdElement Id { get { return id; } set { id = value; } }

        /// <summary>
        /// Тип ошибки
        /// </summary>
        public IdElement Type { get { return type; } set { type = value; } }

        /// <summary>
        /// Оператор, выполняемый в случае ошибки
        /// </summary>
        public StatementElement Statement { get { return statement; } set { statement = value; } }

        /// <summary>
        /// Оператор, выполняемый, если такой ошибки не обнаружено
        /// </summary>
        public StatementElement Else { get { return _else; } set { _else = value; } }

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="StartInfo">информация о позиции элемента в коде</param>
        /// <param name="Id">идентификатор ошибки</param>
        /// <param name="Type">тип ошибки</param>
        /// <param name="Statement">оператор, выполняемый в случае ошибки</param>
        /// <param name="Else">ператор, выполняемый, если такой ошибки не обнаружено</param>
        /// <param name="Comments">комментарии, относящиеся к элементу</param>
        public ExceptOnStatementElement(TokenInfo StartInfo, IdElement Id, IdElement Type, StatementElement Statement, StatementElement Else, List<TokenInfo> Comments)
            : base(StartInfo, Comments)
        {
            id = Id;
            type = Type;
            statement = Statement;
            _else = Else;
        }

        /// <summary>
        /// Представление элемента в строковом формате
        /// </summary>
        /// <returns>строковое представление элемента</returns>
        public override string ToString()
        {
            string result = string.Format("on {0}", id);
            if (type != null)
                result += string.Format(" : {0}", type);
            return string.Format("{0} do {1}{2}", result, statement, (_else == null) ? string.Empty : string.Format(" {0}", _else));
        }

        /// <summary>
        /// Создание типизированного энумератора
        /// </summary>
        /// <returns>энумератор</returns>
        protected override IEnumerator<ISyntaxTreeElement> CreateEnumerator()
        {
            yield return id;
            if (type != null)
                yield return type;
            if (statement != null)
                yield return statement;
            if (_else != null)
                yield return _else;
        }
    }
}
